package com.example.mq.mqserver.core;

import lombok.Data;

import java.io.Serializable;
import java.util.Arrays;
import java.util.UUID;

/**
 * 要传递的消息
 */
@Data
public class Message implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 核心属性
     */

    private BasicProperties basicProperties = new BasicProperties();

    private byte[] body;

    /**
     * 辅助用的属性
     * 偏移量  [offsetBeg, offsetEnd)
     * offsetBeg 消息数据的开头举例文件开头的位置偏移（字节）
     * offsetEnd 消息数据的结尾举例文件开头的位置偏移（字节）
     * 不需要被序列化，消息一旦被写入到文件后，位置就固定了，不需要单独存储
     */
    private transient long offsetBeg = 0;

    private transient long offsetEnd = 0;

    /**
     * 是否为有效消息
     * 逻辑删除
     * 0x1 表示有效，0x0 表示无效
     */
    private byte isValid = 0x1;


    /**
     * 创建一个工厂方法，封装创建 Message 的过程
     * 自动生成唯一的 MessageId
     */
    public static Message createMessageWithId(String routingKey,
                                              BasicProperties basicProperties, byte[] body){
        Message message = new Message();
        if(null != basicProperties){
            message.setBasicProperties(basicProperties);
        }
        // routingKey 和 basicProperties 里的 routingKey 冲突，以外面的为主
        message.basicProperties.setRoutingKey(routingKey);
        // 此处生成的 MessageId 以 M- 为前缀
        message.setMessageId("M-" + UUID.randomUUID());
        message.body = body;
        return message;
    }


    public String getMessageId(){
        return basicProperties.getMessageId();
    }

    public void setMessageId(String messageId){
        basicProperties.setMessageId(messageId);
    }

    public String getRoutingKey(){
        return basicProperties.getRoutingKey();
    }

    public void setRoutingKey(String routingKey){
        basicProperties.setRoutingKey(routingKey);
    }

    public int getDeliverMode(){
        return basicProperties.getDeliverMode();
    }

    public void setDeliverMode(int deliverMode){
        basicProperties.setDeliverMode(deliverMode);
    }

    @Override
    public String toString() {
        return "Message{" +
                "basicProperties=" + basicProperties +
                ", body=" + Arrays.toString(body) +
                ", offsetBeg=" + offsetBeg +
                ", offsetEnd=" + offsetEnd +
                ", isValid=" + isValid +
                '}';
    }
}
